package ferrovia;

import java.util.Map;
import java.util.Set;

/**
 * Interface para acesso aos comandos da rede ferrovi�ria.
 * @author Fernando Vanini
 *
 */

public interface ControleFerrovia extends DefsGlobais{
	
	/**
	 * Registra um tratador para os eventos gerados pela rede ferrovi�ria.
	 * Pode-se registrar mais de um tratador
	 * @param tratador Objeto que implementa a interface TratadorDeEventos.
	 * @return true se o registro for feito normalmente.
	 */
	public boolean registraTratadorDeEventos(TratadorDeEventos tratador);
	
	/**
	 * Consulta aos elementos da rede. Retorna uma lista contendo os id's dos
	 * elementos da rede.
	 * @return lista contendo os id's dos elementos da rede.
	 */
	public String[] consultaElementos();
	
	/**
	 * Consulta os atributos fixos de um elemento da rede.
	 * @param idElemento identifica��o �nica do elemento.
	 * @return mapa <atributo,valor> contendo os atributos fixos do elemento.
	 */
	public Map<TipoAtributo,Object> consultaAtributosFixos(String idElemento);
	
	/**
	 * Consulta o estado (formado pelo conjunto de atributos vari�veis) de
	 * um elemento da rede.
	 * @param idElemento identifica��o �nica do elemento.
	 * @return mapa <atributo,valor> que caracteriza o estado do elemento.
	 */
	public Map<TipoAtributo,Object> consultaEstado(String idElemento);
	
	/**
	 * Consulta um atributo de um elemento da rede.
	 * @param idElemento
	 * @param atributo
	 * @return Object
	 */
	public Object consultaAtributo(String idElemento, TipoAtributo atributo);
	
	/**
	 * Consulta o conjunto de atributos de um dado elemento da rede.
	 * @param idElemento Identifica��o �nica do elemento da rede.
	 * @return conjunto de atributos (fixos e vari�veis) associados ao elemento.
	 */
	public Set<TipoAtributo> consultaListaDeAtributos(String idElemento);
	
	/**
	 * Comando para acelerar uma composic�o.
	 * @param idComposicao Identifica��o �nica da composi��o.
	 * @param velocidade   Velocidade a ser atingida.
	 * @param urgente      Urgente(true) ou normal(false).
	 * @return             Tempo necess�rio para atingir a velocidade.
	 */
	public int acelerarComposicao(String idComposicao, Float velocidade, boolean urgente);
	
	/**
	 * Comando para frear a composi��o.
	 * @param idComposicao Identifica��o �nica da composi��o.
	 * @param velocidade   Velocidade a ser atingida
	 * @param urgente      Urgente(true) ou normal(false).
	 * @return             Tempo necess�rio para realizar a opera��o.
	 */
	public int frearComposicao(String idComposicao, Float velocidade, boolean urgente);
	
	/**
	 * COnsulta a posi��o prevista para um instante futuro.
	 * @param idComposicao Identifica��o �nica da composi��o.
	 * @param instante Instante futuro a ser considerado.
	 * @return A posi��o prevista, no trecho atual.
	 */
	public float consultaPosicao(String idComposicao, int instante);
	
	/**
	 * Consulta o tempo previsto para atingir uma dada posi��o no trecho atual
	 * (considerando a velocidade e taxa de acelera��o ou frenagem atuais).
	 * @param idComposicao Identifica��o �nica da composi��o.
	 * @param posicao Posi��o a ser atingida.
	 * @return Tempo estimado necess�rio para atingir a posi��o.
	 */
	public int consultaTempo(String idComposicao, float posicao);
	
	/**
	 * Comando para mudar o estado de uma chave.
	 * @param idChave    Identifica��o �nica da chave
	 * @param idTrechoA  Identifica��o do trecho a ser conectado � extremidade A da chave.
	 * @param idTrechoB  Identifica��o do trecho a ser conectado � extremidade B da chave.
	 * @return           Tempo necess�rio para realizar a opera��o.
	 */
	public int mudarChave(String idChave, String idTrechoA, String idTrechoB);
	
	/**
	 * Define a resolu��o do rel�gio do simulador (intervalo entre tics).
	 * (default: 15s, habilitado = false)
	 * @param intervalo  Intervalo entre cada tic
	 * @param habilitado Indica se o simulador gera ou n�o o evento relativo ao tic.
	 */
	public void defineTic(int intervalo, boolean habilitado);	

}
